﻿
/* MDC 接口单元
 * mdcif.cpp
 *
 *  Created on: 2020年5月3日
 *      Author: root
 */
//---------------------------------------------------------------------------

#include <stdio.h>
#include "log.h"

#include "mdcif.h"
#include "mdc.h"
//---------------------------------------------------------------------------

static TMDC * MDC[4] = { 0, 0, 0, 0 };
//---------------------------------------------------------------------------

//注册MDC
int RegMDC(int mdcNo)
{
	LogInit();

	int idx = mdcNo - 1;
	if ((idx < 0) || (idx > 3)) return 1;	//编号无效
	TMDC * pMdc = MDC[idx];
	if (!pMdc)
	{
		pMdc = new TMDC(mdcNo);
		if (!pMdc) return 2;				//内存不足，创建对象失败
		MDC[idx] = pMdc;
	}

	return 0;
}
//---------------------------------------------------------------------------

//反注册MDC
int UnregMDC(int mdcNo)
{
	int idx = mdcNo - 1;
	if ((idx < 0) || (idx > 3)) return 1;	//编号无效
	TMDC * pMdc = MDC[idx];
	if (!pMdc) return 2;					//指定MDC未注册

	delete pMdc;
	MDC[idx] = 0;
	return 0;
}
//---------------------------------------------------------------------------

//注册错误信息回调函数，当内部出错时，会将错误信息返回给上层应用
int RegErrCallback(int mdcNo, TErrorCallback ACallback)
{
	int idx = mdcNo - 1;
	if ((idx < 0) || (idx > 3)) return 1;	//编号无效
	TMDC * pMdc = MDC[idx];
	if (!pMdc) return 2;					//指定MDC未注册
	pMdc->ErrCallback = ACallback;
	return 0;
}
//---------------------------------------------------------------------------

//注册事件通知函数
int RegNotifyEventCallback(int mdcNo, TOnNotifyEvent ACallback)
{
	int idx = mdcNo - 1;
	if ((idx < 0) || (idx > 3)) return 1;	//编号无效
	TMDC * pMdc = MDC[idx];
	if (!pMdc) return 2;					//指定MDC未注册

	pMdc->NotifyEvent = ACallback;
	return 0;
}
//---------------------------------------------------------------------------

//MDC初始化通讯参数，IP: 如192.168.1.35, 端口: 如6000
int MDCInit(int mdcNo, char *pzIPv4, uint16 uPort)
{
	int idx = mdcNo - 1;
	if ((idx < 0) || (idx > 3)) return 1;	//编号无效(1-4)
	TMDC * pMdc = MDC[idx];
	if (!pMdc) return 2;					//指定MDC未注册
	int iRet = pMdc->Init(pzIPv4, uPort);
	if (iRet == 1) return 3;				//IP或端口无效
	if (iRet == 2) return 4;				//MDC工作中不能重复初始化
	return 0;
}
//---------------------------------------------------------------------------

//启动与MDC交互的工作线程，自动与MDC进行协议层交互
int StartWork(int mdcNo)
{
	int idx = mdcNo - 1;
	if ((idx < 0) || (idx > 3)) return 1;	//编号无效
	TMDC * pMdc = MDC[idx];
	if (!pMdc) return 2;					//指定MDC未注册
	int iRet = pMdc->StartWork();
	return iRet;
}
//---------------------------------------------------------------------------

//停止与MDC交互的工作线程
int StopWork(int mdcNo)
{
	int idx = mdcNo - 1;
	if ((idx < 0) || (idx > 3)) return 1;	//编号无效
	TMDC * pMdc = MDC[idx];
	if (!pMdc) return 2;					//指定MDC未注册
	int iRet = pMdc->StopWork();
	if (iRet != 0) return 3;				//失败
	return 0;
}
//---------------------------------------------------------------------------

//cmd: 命令标识；
//201: 查MDC系统时间，pData: 无效,可为NULL，uSize: 无效，可为0;
//202: 设MDC系统时间，pData指向数据结构TDATETIME（日期时间），uSize为其长度;
//203: 查枪油品信息，pData指向TNZLADDR结构数据，uSize为其长度（字节数），可查1个或多个；
//204: 设置枪油品信息，pData指向TNZLOILINFO结构数据，uSize为其长度（字节数），可设1个或多个；
//205: 查枪泵码信息，pData指向TNZLADDR结构数据，uSize为其长度（字节数），可查1个或多个；
//206: 查指定MDC TTC交易，pData为指向TMDCTTC的结构，uSize为其长度（字节数），可查1个或多个；
//207: 查通道最大MDC TTC，pData为指向的BYTE值(1-16)的通道，uSize为其长度（字节数），可查1个或多个；
//208: 设置上位机授权时段，最多三个时段，pData为指向的结构，uSize为其长度
//209: 查上位机授权时段，pData: 无效,可为NULL，uSize: 无效，可为0;
//210: 给指枪授权开机加油，pData指向TNZLADDR结构数据，uSize为其长度（字节数），可授权1个或多个；枪在加油中或离线状态不能授权；
//211: 取消授权，pData指向TNZLADDR结构数据，uSize为其长度（字节数），可取消授权1个或多个；
//212: 查集线器硬件信息，pData: 无效,可为NULL，uSize: 无效，可为0, 返回结果为TDEVINFO;

//主动向MDC发送命令
int DoCommand(int mdcNo, int cmd, BYTE *pData, uint32 uSize)
{
	int idx = mdcNo - 1;
	if ((idx < 0) || (idx > 3)) return 1;	//编号无效
	TMDC * pMdc = MDC[idx];
	if (!pMdc) return 2;					//指定MDC未注册
	int iRet = pMdc->DoCommand(cmd, pData, uSize);
	if (iRet != 0) return 3;				//失败
	return 0;
}
//---------------------------------------------------------------------------

